#ifndef _SCRIPT_FILE_H_
#define _SCRIPT_FILE_H_

#include "Common.h"
#include "Resource.h"
#include "tinyxml/tinyxml.h"
#include "String.h"

class Item;
class ItemPtr;
class Character;
class CharPtr;

class ScriptFile
{
public:
	ScriptFile(void);
	ScriptFile(const String & filename);
	virtual ~ScriptFile(void);

	virtual bool	LoadFile(const String & scpfile);
	virtual bool	SaveFile(const String & scpfile);

	virtual bool 	LoadFile(void);
	virtual bool	SaveFile(void);
	
	virtual bool	Unload(void);
	virtual bool	Reload(void);


	TiXmlElement * getSection(const String & section);
	
	//返回 section 为 "UINT32_LIST_%u" 的整形列表  返回取回的数量
	virtual size_t	getUInt32List(const uint32 & index,std::vector<uint32> * result);
	//返回 section 为 "INT32_LIST_%u" 的整形列表 返回取回的数量
	virtual size_t  getInt32List(const uint32 & index,std::vector<int32> * result);
	
	
	//返回 section 为 "FLOAT_LIST_%u" 的浮点列表 返回取回的数量
	virtual size_t  getFloatList(const uint32 & index,std::vector<float> * result);
	//返回 section 为 "STRING_LIST_%u" 的字符列表 返回取回的数量
	virtual size_t  getStringList(const uint32 & index,std::vector<String> * result);

	//返回 section 为 "UINT64_LIST_%u" 的整形列表  返回取回的数量
	virtual size_t	getUInt64List(const uint32 & index,std::vector<uint64> * result);
	//返回 section 为 "INT64_LIST_%u" 的整形列表 返回取回的数量
	virtual size_t  getInt64List(const uint32 & index,std::vector<int64> * result);
	
	
	//返回 section 为 "DOUBLE_LIST_%u" 的浮点列表 返回取回的数量
	virtual size_t  getDoubleList(const uint32 & index,std::vector<double> * result);


	//得到节点整数，无符号整数 浮点，字符串设置
	virtual uint32	getAttributeUInt(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual float	getAttributeFloat(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual int32	getAttributeInt(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual String  getAttributeString(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual uint64	getAttributeUInt64(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual double	getAttributeDouble(TiXmlElement * elm,const char * attribute_name = "VALUE");
	virtual int64	getAttributeInt64(TiXmlElement * elm,const char * attribute_name = "VALUE");
	//是否存在属性值
	virtual bool	hasAttribute(TiXmlElement * elm,const char * attribute_name = "VALUE");
	//根据脚本创建资源对象
	virtual ResourcePtr	CreateScript(const uint32 & index);
	//根据脚本创建资源对象且执行载入操作
	virtual ResourcePtr	LoadScript(const uint32 & index);

	//根据基础脚本设置资源数据
	virtual  bool	LoadResourceScript(const String & section, Resource * resource);	
protected:
	String 					m_xmlfile;
	TiXmlDocument 				m_doc;
	std::map<String,TiXmlElement*>		m_XMLNodeMap;
	bool					m_loaded;
	
};


class ItemScriptFile :public ScriptFile
{
public:
	ItemScriptFile(const String & filename);
	virtual ~ItemScriptFile(void);

	//根据脚本指令，创建物品资源对象
	ResourcePtr	CreateScript(const uint32 & index);
	//根据脚本指令 创建物品资源对象并载入
	//ResourcePtr	LoadScript(const uint32 & index);
};


class CharScriptFile :public ScriptFile
{
public:
	CharScriptFile(const String & filename);
	virtual ~CharScriptFile(void);
	
	ResourcePtr	CreateScript(const uint32 & index);
};

typedef struct _script_item_tag_
{
	uint32	model_id;
	uint16	flag;	//保留
	uint32	id;	//物品资源ID
	String  name;	//物品名字
	String	desc;	//物品描述
	uint8	lv;	//物品等级
	uint8	lv_ext;	//物品强化等级
	uint32	num;	//物品的数量
	uint32	script_id;	//创建物品需要的脚本ID
	float	chance;

	void	initialize(void)
	{
		model_id = 0;
		flag = 0;
		id = 0;
		name = "unkown name";
		desc = "";
		lv = 0;
		lv_ext = 0;
		chance = 1.0f;
		script_id = 0;
	}

	_script_item_tag_(void)
	{
		initialize();
	}
}script_item_st;

typedef std::list<script_item_st>	ScriptItemList;

typedef struct 	_making_script_tag_
{
	uint32					index;		//脚本对应的ID
	String					name;		//制造的名称
	String					desc;		//制造的描述
	ScriptItemList				src_items;	//需要的原材料物品
	ScriptItemList				dest_items;	//最终制造的物品
	ScriptItemList				split_items;	//物品分解的原料
	ScriptItemList				intensify;	//物品强化需要的物品资源
}making_item_st;


class MakingScriptFile :public ScriptFile
{
public:
        MakingScriptFile(const String & filename);
        virtual ~MakingScriptFile(void);


	const making_item_st * loadMakingScript(const uint32 & index);

	const making_item_st * getMaking(const uint32 & index);

	void clearAllMaking(void);
protected:
	std::map<uint32,const making_item_st *>		making_maps;
	
	
};

#endif
